﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using tea.BL;
using tea.DB;
using tea.Models;
using Util;

namespace tea.Controllers
{
    [Authorize(Roles = BL사용자.ADMIN)]
    public class LogController : Controller
    {

        [HttpGet]
        [Authorize(Roles = BL사용자.ADMIN)]
        public ActionResult List(PaginationModel pagination)
        {
            string 키 = "LogList";
            ViewState.Load(키, pagination, PaginationModel.DEFAULT);

            using (var db = new DBDataContext())
            {
                var list = db.로그기록.Where(p => true);

                // 검색
                if (pagination.srchType == BL로그기록.검색_없음 ||
                     (Request.Url.Query.IndexOf("srchText") > 0 && string.IsNullOrWhiteSpace(Request.QueryString["srchText"])))
                {
                    pagination.srchType = BL로그기록.검색_없음;
                    pagination.srchText = null;
                }
                else {
                    switch (pagination.srchType) {
                        case BL로그기록.검색_URL: list = list.Where(p => p.URL.Contains(pagination.srchText)); break;
                        case BL로그기록.검색_구분: list = list.Where(p => p.구분.Contains(pagination.srchText)); break;
                        case BL로그기록.검색_내용: list = list.Where(p => p.내용.Contains(pagination.srchText)); break;
                        default: Debug.Assert(false); break;
                    }
                }

                // 정렬
                switch (pagination.order.Value) {
                    case BL로그기록.정렬_일시: list = list.OrderByDescending(p => p.일시); break;
                    case BL로그기록.정렬_사용자: list = list.OrderBy(p => p.사용자ID).ThenBy(p => p.일시); break;
                    case BL로그기록.정렬_IP: list = list.OrderBy(p => p.IP).ThenBy(p => p.일시); break;
                    case BL로그기록.정렬_URL: list = list.OrderBy(p => p.URL).ThenBy(p => p.일시); break;
                    case BL로그기록.정렬_구분: list = list.OrderBy(p => p.구분).ThenBy(p => p.일시); break;
                    default: Debug.Assert(false); break;
                }

                // 현재 페이지
                pagination.pageCount = (int)Math.Ceiling((double)list.Count() / (double)pagination.size);
                pagination.page = Math.Max(1, Math.Min(pagination.page.Value, pagination.pageCount.Value));
                pagination.url = Url.LogList(new PaginationModel { ID = pagination.ID, page = 989898 }).Replace("989898", "{0}");

                var 모델 = new LogListModel {
                    pagination = pagination,
                    로그목록 = list.Skip((pagination.page.Value - 1) * pagination.size.Value)
                                   .Take(pagination.size.Value)
                                   .Select(p => new 로그Model(p)).ToList()
                };
                foreach (var 항목 in 모델.로그목록) {
                    var 사 = db.사용자.FirstOrDefault(p => p.ID == 항목.사용자ID);
                    if (사 != null) 항목.사용자 = 사.이름;
                }
                ViewState.Save(키, pagination);
                return View(모델);
            }
        }

        [HttpGet]
        public ActionResult Log(int id)
        {
            using (var db = new DBDataContext()) {
                var 로그 = db.로그기록.Single(p => p.ID == id);
                var 모델 = new 로그Model(로그);
                var 사 = db.사용자.FirstOrDefault(p => p.ID == 모델.사용자ID);
                if (사 != null) 모델.사용자 = 사.이름;
                return View(모델);
            }
        }

        [HttpPost]
        [Util.AjaxOnly]
        public ActionResult DeleteList(int[] ID)
        {
            using (var db = new DBDataContext()) {
                foreach (var id in ID) {
                    var 로 = db.로그기록.FirstOrDefault(p => p.ID == id);
                    if (로 == null) continue;
                    db.로그기록.DeleteOnSubmit(로);
                }
                db.SubmitChanges();
                return Json(new AjaxSuccessModel(Url.Action("List", "Log")));
            }
        }

        [HttpPost]
        [Util.AjaxOnly]
        public ActionResult Delete(int id)
        {
            using (var db = new DBDataContext()) {
                var 로 = db.로그기록.FirstOrDefault(p => p.ID == id);
                if (로 != null) {
                    db.로그기록.DeleteOnSubmit(로);
                    db.SubmitChanges();
                }
                return Json(new AjaxSuccessModel(Url.Action("List", "Log")));
            }
        }
    }
}
